//---------------------------------------------------------------------------------------
CONST

	TILES_X 	= 30;	// cantidad maxima de tiles en el mapa
	TILES_Y 	= 30;
	
	TILE_X 		= 64;	// dimensiones del tile
	TILE_Y 		= 64;
	
	TILE_SCALE = 100;

END

//---------------------------------------------------------------------------------------
TYPE _point
// tipo de dato _point, para agrupar coordenadas y otros valores
	
	int x;
	int y;
END


//---------------------------------------------------------------------------------------
GLOBAL

	STRUCT ts
		
		_point startPoint;	// punto en pantalla donde comienza el dibujado
		_point endPoint;	// punto en pantalla donde termina el dibujado
		
		_point pos;			// posicion actual del scroll
		
		int draw;	// flag indica si debe ser actualizado ( redibujado )
		
		int fpg;	// id del fpg
	END
	
	STRUCT map
	
		_point dim;	// dimensiones del mapa, en tiles
		
		byte base[TILES_X][TILES_Y]; // capa de fondo
		
		byte over[TILES_X][TILES_Y]; // capa principal
	END
	
	bg_fpg;

END


//---------------------------------------------------------------------------------------
PROCESS tsManager(x0, y0, x1, y1)
//
// Maneja el dibujado del scroll
//

PRIVATE

	_point tsLimite;	// posicion maxima del scroll

END

BEGIN

	priority = 1;

	// configura parametros del scroll
	// ( tamaño y dimensiones del scroll en pantalla )
	ts.startpoint.x = x0;
	ts.startpoint.y = y0;
	ts.endpoint.x = x1;
	ts.endpoint.y = y1;
	

	// calcula limite ( constante )
	tsLimite.x = TILE_X * TILES_X - (ts.endpoint.x-ts.startpoint.x);
	tsLimite.y = TILE_Y * TILES_Y - (ts.endpoint.y-ts.startpoint.y);
	
	print("Limite X: "+ tsLimite.x +" ("+ TILE_X * TILES_X +"-"+(ts.endpoint.x-ts.startpoint.x)+")");
	print("Limite Y: "+ tsLimite.y +" ("+ TILE_Y * TILES_Y +"-"+(ts.endpoint.y-ts.startpoint.y)+")");
	
	// rellena el mapa con datos aleatorios
	//tsMapFill();
	
	// carga fpg del scroll
	ts.fpg = load_fpg("fpg/tiles.fpg");
	
	// indica que el mapa debe ser dibujado
	ts.draw = true;

	LOOP
		
		//pregunta si el mapa debe ser actualizado
		IF ( ts.draw )
		
			// primero comprueba los limites del scroll
			IF ( ts.pos.x < 0 ) ts.pos.x = 0; END	// minimo
			IF ( ts.pos.y < 0 ) ts.pos.y = 0; END
			IF ( ts.pos.x > tsLimite.x ) ts.pos.x = tsLimite.x;	END	//maximo
			IF ( ts.pos.y > tsLimite.y ) ts.pos.y = tsLimite.y;	END
			
			// y luego realiza el dibujado
			tsDraw();
			ts.draw = false;
		END
		
		frame;
		
	END

END


//---------------------------------------------------------------------------------------
FUNCTION tsDraw()
//
// Dibuja el scroll
//

PRIVATE
	i,j;
	
	tiles_en_x;
	tiles_en_y;
	
	tile_inicial_x;
	tile_inicial_y;
	
	_point tile_pos;	// posicion del tile a ser dibujado
END

BEGIN

	// valores constantes
	tiles_en_x = 1 + (ts.endpoint.x - ts.startpoint.x) / TILE_X;
	tiles_en_y = 2 + (ts.endpoint.y - ts.startpoint.y) / TILE_Y;
	
	tile_inicial_x = ts.pos.x / TILE_X;
	tile_inicial_y = ts.pos.y / TILE_Y;
	
	// comienza el dibujado
	clear_screen();

	FOR (i=tile_inicial_x; i < tile_inicial_x + tiles_en_x; i++)
	
		// limito el dibujado de tiles al ancho del mapa
		IF( i >= TILES_X ) BREAK; END
			
		FOR (j=tile_inicial_y; j < tile_inicial_y + tiles_en_y; j++)
		
			// limito el dibujado de tiles al alto del mapa
			IF ( j >= TILES_Y ) BREAK; END
		
			// calcula la posicion del tile
			tile_pos.x = ts.startpoint.x + (i * TILE_X + TILE_X / 2) - ts.pos.x;
			tile_pos.y = ts.startpoint.y + (j * TILE_Y + TILE_Y / 2) - ts.pos.y;
		
			// dibujo primero el fondo
			IF ( map.base[i][j] )
				xput (ts.fpg, map.base[i][j], tile_pos.x, tile_pos.y, 0, TILE_SCALE, 0, 0) ;
			END
			
			// luego los tiles principales
			IF ( map.over[i][j] )
				xput (ts.fpg, map.over[i][j], tile_pos.x, tile_pos.y, 0, TILE_SCALE, 0, 0) ;
			END
			
		END
	END
	
	return 0;

END


//---------------------------------------------------------------------------------------
PROCESS tsCamera( objetive )
//
// Cambia las coordenadas del scroll dependiendo la posicion de un proceso
// Se le pasa como parametro la ID de un proceso
//

BEGIN

	LOOP
		
		ts.pos.x = objetive.x;
		ts.pos.y = objetive.y;
		
		ts.draw = true;
	
		frame;
	END
END

//---------------------------------------------------------------------------------------
PROCESS tsMove()
//
// Cambia las coordenadas del scroll
// (DEBUG)
//

PRIVATE
	vel = 8;
END

BEGIN

	LOOP
	
		// derecha
		IF ( key ( _right ) )
			ts.pos.x+=vel;
			ts.draw = TRUE;
		END
		
		// izquierda
		IF ( key ( _left ) )
			ts.pos.x-=vel;
			ts.draw = TRUE;
		END
		
		// abajo
		IF ( key ( _down ) )
			ts.pos.y+=vel;
			ts.draw = TRUE;
		END
		
		// arriba
		IF ( key ( _up ) )
			ts.pos.y-=vel;
			ts.draw = TRUE;
		END
		
	
		frame;
		
	END

END

